/*
Q900.h Arduino library for controlling a guohe Q900 radio via CAT commands.

*/

#define MAX_BUF_SIZE 24   //最大数据缓存
#define CAT_HEAD 0XA5     //默认包头
#define CAT_FREQ_SET 0x09 //设置频率
#define CAT_SPEC_GET 0X39 //频谱请求 


/*
#define CAT_PPT_SET 0x07//设置PPT状态


#define CAT_MODE_SET 0x0A//模式设置
#define CAT_POWER_OFF 0X0C//关闭电台
#define CAT_VOLUME_SET 0X0D//音量调节0~30
#define CAT_HVOLUME_SET 0X0E//耳机音量0~30
#define CAT_MIC_FAIN_SET 0X0F//MIC增益0~100
#define CAT_VOICE_COMP_SET 0X10//语音压缩0~14
#define CAT_BASS_EQ_SET 0X11//低音EQ0~40
#define CAT_ATR_EQ_SET 0X12//高音EQ0~40
#define CAT_RF_RFG_SET 0X13//射频增益0~100
#define CAT_IF_RFG_SET 0X14//中频增益0~80
#define CAT_SQL_SET 0X15//静噪0~20
#define CAT_AGC_SET 0X16//自动增益0~5
#define CAT_AMP_SET 0X17//前级放大
#define CAT_FILTER_SET 0X18//滤波器
#define CAT_NR_SET 0X19//NR
#define CAT_NB_SET 0X1A//NB
#define CAT_AB_SET 0X1B//AB 频率
#define CAT_SPLIT_SET 0X1C//异频开关
#define CAT_BAND_SET 0X1D//频段
*/
#define ADU_R_VALUE 128 // ADU 基准
#define ALC_R_VALUE 64  // ALC基准

//懒得写了 用时再说

#define CAT_POWER_SET 0X2C //频段

#define CAT_INFO_GET 0x0B //同步信息

#define CAT_DELAY 2//串口数据发送延时 

class Q900 {
public:
  // 默认通讯端口
  
  Q900();
  //状态缓存
  byte TX = 0;               //发射状态
  byte VA_MODE = 0;          // VOF_A 模式
  byte VB_MODE = 0;          // VOF_A 模式
  unsigned long VA_FREQ = 0; // A频率
  unsigned long VB_FREQ = 0; // B频率
  byte A_B_MODE = 0;         // A/B工作
  byte NB_ON = 0;            // NB状态
  byte NR_ON = 0;            // NR状态
  byte RIT = 0;              // RIT 0偏值60
  byte XIT = 0;              // XIT 0偏值60
  byte FILTER = 0;           //滤波器带宽
  byte SPECTRNMU = 0;        //频谱带宽
  byte VOLTAGE = 0;          //电压
  byte SMETER = 0; // S表
  byte POWER = 0;  //功率
  // byte SWR=0;
  byte SAA_TYPE = 0;  // 0:SWR 64:ADU 128:ALC
  byte SAA_VALUE = 0; // SWR/AUD/ALC值
  byte TUNE = 0;      //天调状态
  byte PLEVER = 0;    //功率等级
  //byte BT = 0;        //蓝牙状态
  //byte GPS = 0;       // GPS模块
  //byte LORA = 0;      // LORA状态
  //byte COMPASS = 0;   // 电子罗盘

  // 设置
  void setSerial();                                      //设置软件串口   
  void begin(unsigned long baud);                                  // 设置通讯速率
  void end();//结束软串口
  void singleCmd(byte cmd, byte *data,byte len); //生成协议数据
  byte getRadioData(); //强制获得电台返回数据
  void SynRadioData(); //同步电台信息
  void SetFrequency();
  // void Ptt(bool ptt);

  String ReadSerialData();          //读取串口数据 同步
  void PrintSerialData(String str); //输出串口数据
  void ClreaBtSerial();             //清除串口数据
  void sendRadioDataBySerial();     //硬件串口转发Q900协议
  void IntToHEXArray(unsigned int num, uint8_t *dest); //数字转HEX数组 高低位  
  void FerqToHEXArray(unsigned long num, uint8_t *dest);
  void GetSPEC();//获得频谱数据
  byte GetSSByte();//获得串口数据
  void ClreaSerial();//清除串口数据
  

  
private:
  unsigned int CRC16Check(unsigned char *buf, unsigned char len); // CRC校验
  void AsciiToHex(char *src, uint8_t *dest, byte len);  //字符转换HEX
  void sendRadioData(short len);                  //发送电台数据
  
  byte radioBuff[MAX_BUF_SIZE];                  //接收数据缓存
  byte cmdDataBUF[16] = {0};                      //发送数据缓存
  unsigned long HexToLong(byte D1,byte D2,byte D3,byte D4); // HEX转数字
  String Byte2HEXStr(byte dt);
};
